home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 176-200 / disk_185 / examples / pgtb / pgtb.zoo / tbdump.c < prev    next >
C/C++ Source or Header  |  1988-12-12  |  7KB  |  291 lines

  1. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  2. /* |_o_o|\\  The Software Distillery                         */
  3. /* |. o.| || Made available to the Amiga development community             */
  4. /* | .    | || the authors:                       BBS:      */
  5. /* | o    | ||   John Mainwaring, Jim Cooper             (919)-471-6436  */
  6. /* |  . |//                                     */
  7. /* ======                                     */
  8. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  9.  
  10. /* these routines print out the traceback data */
  11.  
  12. #include "tb.h"
  13. #include "exec/execbase.h"
  14.  
  15. extern struct tbtemplate *tbdata;
  16.  
  17. char *desc[] = {
  18.    "???",
  19.    "???",
  20.    "Bus",
  21.    "Address",
  22.    "Illegal Instruction",
  23.    "Divide by Zero",
  24.    "CHK instruction",
  25.    "TRAPV Instruction",
  26.    "Privilege Violation",
  27.    "Trace",
  28.    "Line A Emulation",
  29.    "Line F Emulation",
  30.    "???",
  31.    "???",
  32.    "???",
  33.    "Uninitialized Interrupt Vector",
  34.    "???",
  35.    "???",
  36.    "???",
  37.    "???",
  38.    "???",
  39.    "???",
  40.    "???",
  41.    "???",
  42.    "Spurious Interrupt",
  43.    "Level 1 Interrupt",
  44.    "Level 2 Interrupt",
  45.    "Level 3 Interrupt",
  46.    "Level 4 Interrupt",
  47.    "Level 5 Interrupt",
  48.    "Level 6 Interrupt",
  49.    "Level 7 Interrupt",
  50.    "TRAP #00",
  51.    "TRAP #01",
  52.    "TRAP #02",
  53.    "TRAP #03",
  54.    "TRAP #04",
  55.    "TRAP #05",
  56.    "TRAP #06",
  57.    "TRAP #07",
  58.    "TRAP #08",
  59.    "TRAP #09",
  60.    "TRAP #10",
  61.    "TRAP #11",
  62.    "TRAP #12",
  63.    "TRAP #13",
  64.    "TRAP #14",
  65.    "TRAP #15",
  66.    "???"
  67. };
  68.  
  69. void dofail(void);
  70. void doregs(void);
  71. void doenv(void);
  72. void dostak(void);
  73. void doudat(void);
  74. void dotrace(void);
  75. void dosymtab(void);
  76. void dofmem(void);
  77.  
  78. void tbdump(flags)
  79. int flags;
  80. {
  81. if (flags & ENVFLG)
  82.    doenv();
  83. if (flags & SYMFLG)
  84.    dosymtab();
  85. if (flags & FAILFLG)
  86.    dofail();
  87. if (flags & TRACEFLG)
  88.    dotrace();
  89. if (flags & REGFLG)
  90.    doregs();
  91. if (flags & FMEMFLG)
  92.    dofmem();
  93. if (flags & STAKFLG)
  94.    dostak();
  95. if (flags & UDATFLG)
  96.    doudat();
  97. }
  98.  
  99. void doenv()
  100. /*   -----*/
  101. {
  102. char processortype = {'0'};
  103.  
  104. if (tbdata->gotvers)
  105.    printf("TraceDump Utility: %s; Version %ld, Revision %ld\n",
  106.     tbdata->filename, tbdata->ver, tbdata->rev);
  107.  
  108. if (!tbdata->gotfail)
  109.    return;
  110. if (tbdata->environ & AFF_68020)
  111.    processortype = '2';
  112. else if (tbdata->environ & AFF_68010)
  113.    processortype = '1';
  114. printf("Processor type: 680%c%s\n", processortype,
  115.     (tbdata->environ & AFF_68881) ? "0 with 68881" : "0");
  116. printf("VBlankFreq %d, PowerSupFreq %d\n\n", tbdata->vbfreq, tbdata->psfreq);
  117. }
  118.  
  119. void doregs()
  120. /*   ------*/
  121. {
  122. long i, cc = tbdata->cc;
  123. char *ccbits = "CVZNX";
  124.  
  125. if (!tbdata->gotregs)
  126.    return;
  127.  
  128. printf("\nRegisters:\n");
  129.  
  130. for (i=0; i<8; i++)
  131.    printf("D%d=%08lx%c", i, tbdata->dregs[i], ((i&3)==3?'\n':' '));
  132.  
  133. for (i=0; i<8; i++)
  134.    printf("A%d=%08lx%c", i, tbdata->aregs[i], ((i&3)==3?'\n':' '));
  135.  
  136. printf("PC %06lx   ", tbdata->pc);
  137. for (i = 0; i < 5; i++)
  138.    {
  139.    printf("%c=%c ",ccbits[i], cc & 1 ? '1' : '0');
  140.    cc >>= 1;
  141.    }
  142. printf("\n");
  143. }
  144.  
  145. void dofail()
  146. /*   ------*/
  147. {
  148. long i;
  149. struct addrinfo info;
  150.  
  151. printf("Program Name: %s; run from %s\n",
  152.     tbdata->taskname, tbdata->starter ? "CLI" : "WorkBench");
  153. printf("Program load map (addresses are APTRs, sizes are in bytes)\n");
  154.  
  155. for (i = 0; i < tbdata->segcount; i++)
  156.    printf("%06lx $%-5x%c", tbdata->segments[i].addr,
  157.         tbdata->segments[i].size, ((i & 3) == 3) ? '\n' : ' ');
  158. if ((i & 3) != 3) printf("\n"); /* don't leave cursor hanging */
  159.  
  160. printf("Terminated with GURU number %08lx, %s Error\n",
  161.     tbdata->guru, desc[tbdata->guru]);
  162. if (locaddr(tbdata->pc, &info))
  163.    {
  164.    if (info.name)
  165.       printf("Failed at %lx = %s+$%lx",
  166.     tbdata->pc, info.name, info.offset);
  167.    else
  168.       printf("Failed at %lx, hunk %d+$%lx",
  169.     tbdata->pc, info.hunknum, info.offset);
  170.    if (info.objname)
  171.       printf(", file %s line %ld+$%lx\n",info.objname,info.line,info.lineoff);
  172.    else
  173.       printf("\n");
  174.    }
  175. }
  176.  
  177. void dostak()
  178. /*   ------*/
  179. {
  180. printf("\nstack top: %lx, stack pointer: %lx, stack length: $%lx\n",
  181.     tbdata->staktop, tbdata->stakptr, tbdata->staklen<<2);
  182.  
  183. if (tbdata->topseg)
  184.    {
  185.    printf("top 4k segment present\n");
  186.    hexdump(stdout, (unsigned char *)tbdata->stak, 4096, tbdata->stakptr);
  187.    }
  188.  
  189. if (tbdata->botseg)
  190.    {
  191.    printf("bottom 4k segment present\n");
  192.    hexdump(stdout, (unsigned char *)&tbdata->stak[1024], 4096,
  193.              tbdata->staktop-4096 /* I hope - could be off */);
  194.    }
  195.  
  196. if (tbdata->seglen)
  197.    {
  198.    printf("entire stack, size = $%lx bytes\n", tbdata->seglen<<2);
  199.    hexdump(stdout ,(unsigned char *)tbdata->stak, tbdata->staklen<<2,
  200.              tbdata->stakptr);
  201.    }
  202. }
  203.  
  204. void doudat()
  205. /*   ------*/
  206. {
  207. struct udata *this = tbdata->udhead;
  208.  
  209. while (this)
  210.    {
  211.    printf("\nUser data section, size = $%lx bytes\n", this->udsize << 2);
  212.    hexdump(stdout, (unsigned char *)&(this->udat[0]), this->udsize << 2, 0);
  213.    this = this->udptr;
  214.    }
  215. }
  216.  
  217. void dofmem()
  218. /*   ------*/
  219. {
  220. ULONG ciu, fiu;
  221.  
  222. if (!tbdata->gotfmem)
  223.    return;
  224. printf("\nMemory Statistics\n      Available    In-Use   Maximum   Largest\n");
  225. printf("chip%11ld%10ld%10ld%10ld\n", tbdata->memca,
  226.   (ciu = tbdata->memcm - tbdata->memca), tbdata->memcm, tbdata->memcl);
  227. printf("fast%11ld%10ld%10ld%10ld\n", tbdata->memfa,
  228.   (fiu = tbdata->memfm - tbdata->memfa), tbdata->memfm, tbdata->memfl);
  229. printf("total%10ld%10ld%10ld%10ld\n", tbdata->memca+tbdata->memfa,
  230.   ciu+fiu, tbdata->memcm+tbdata->memfm, tbdata->memcl+tbdata->memfl);
  231. }
  232.  
  233. void dotrace()
  234. /*   -------*/
  235. {
  236. ULONG a5;
  237. struct addrinfo info;
  238.  
  239. if (tbdata->seglen == 0)
  240.    return;    /* only try this trick on entire stack        */
  241.  
  242. a5 = tbdata->aregs[5];
  243. while ((a5 < tbdata->staktop) && (a5 >= tbdata->stakptr))
  244.    /* a5 within bounds of stack                 */
  245.    {
  246.    a5 = (a5 - tbdata->stakptr) >> 2;    /* index to saved stack */
  247.    if (!locaddr(tbdata->stak[a5+1], &info))
  248.       return;    /* doesn't look like a good return address      */
  249.  
  250.    if (info.name)
  251.       printf("   called from %lx = %s+$%lx",
  252.       tbdata->stak[a5+1], info.name, info.offset);
  253.    else
  254.       printf("   called from %lx = hunk %d+$%lx",
  255.       tbdata->stak[a5+1], info.hunknum, info.offset);
  256.  
  257.    if (info.objname)
  258.       printf(", file %s line %ld+$%lx\n",info.objname,info.line,info.lineoff);
  259.    else
  260.       printf("\n");
  261.  
  262.    a5 = tbdata->stak[a5];
  263.    }
  264. }
  265.  
  266. void dosymtab()
  267. /*   --------*/
  268. {
  269. struct symbol_node *symaddr;
  270. long hunkcount, i;
  271.  
  272. for (hunkcount = 0; hunkcount <tbdata->segcount; hunkcount++)
  273.    {
  274.    symaddr = tbdata->segments[hunkcount].symbols;
  275.    i = 0;
  276.    if (symaddr)
  277.       printf("Symbols for hunk %d\n", hunkcount);
  278.    while (symaddr)
  279.       {
  280.       printf("%20.20s = %6lx%c", symaddr->sn_sym, symaddr->sn_value,
  281.           (i & 1) == 0 ? ' ' : '\n');
  282.       symaddr = symaddr->sn_next;
  283.       i++;
  284.       }
  285.    if (i & 1)
  286.       printf("\n");
  287.    }
  288. printf("\n");
  289. }
  290.  
  291.